package de.saring.exerciseviewer.gui.panels; import de.saring.exerciseviewer.gui.EVDocument; import javafx.collections.FXCollections; import javafx.fxml.FXML; import javafx.scene.control.Label; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.cell.PropertyValueFactory; import de.saring.exerciseviewer.data.ExerciseSample; import de.saring.exerciseviewer.data.RecordingMode; import de.saring.exerciseviewer.gui.EVContext; import de.saring.util.gui.javafx.FormattedNumberCellFactory; /** * Controller (MVC) class of the "Samples" panel, which displays all recorded samples of the exercise in a table. * * @author Stefan Saring */ public class SamplePanelController extends AbstractPanelController { @FXML private TableView<ExerciseSample> tvSamples; @FXML private TableColumn<ExerciseSample, Number> tcTime; @FXML private TableColumn<ExerciseSample, Number> tcHeartrate; @FXML private TableColumn<ExerciseSample, Number> tcAltitude; @FXML private TableColumn<ExerciseSample, Number> tcSpeed; @FXML private TableColumn<ExerciseSample, Number> tcDistance; @FXML private TableColumn<ExerciseSample, Number> tcCadence; @FXML private TableColumn<ExerciseSample, Number> tcTemperature; /** * Standard c'tor for dependency injection. * * @param context the ExerciseViewer UI context * @param document the ExerciseViewer document / model */ public SamplePanelController(final EVContext context, final EVDocument document) { super(context, document); } @Override protected String getFxmlFilename() { return "/fxml/panels/SamplePanel.fxml"; } @Override protected void setupPanel() { // setup table columns tcTime.setCellValueFactory(new PropertyValueFactory<>("timestamp")); tcHeartrate.setCellValueFactory(new PropertyValueFactory<>("heartRate")); tcAltitude.setCellValueFactory(new PropertyValueFactory<>("altitude")); tcSpeed.setCellValueFactory(new PropertyValueFactory<>("speed")); tcDistance.setCellValueFactory(new PropertyValueFactory<>("distance")); tcCadence.setCellValueFactory(new PropertyValueFactory<>("cadence")); tcTemperature.setCellValueFactory(new PropertyValueFactory<>("temperature")); // setup custom number cell factories for all table columns final RecordingMode recordingMode = getDocument().getExercise().getRecordingMode(); tcTime.setCellFactory(new FormattedNumberCellFactory<>(value -> getContext().getFormatUtils() .seconds2TimeString(value.intValue() / 1000))); tcHeartrate.setCellFactory(new FormattedNumberCellFactory<>(value -> getContext().getFormatUtils() .heartRateToString(value.intValue()))); tcAltitude.setCellFactory(new FormattedNumberCellFactory<>(value -> recordingMode.isAltitude() ? getContext() .getFormatUtils().heightToString(value.intValue()) : null)); tcSpeed.setCellFactory(new FormattedNumberCellFactory<>(value -> recordingMode.isSpeed() ? getContext() .getFormatUtils().speedToString(value.floatValue(), 2) : null)); tcDistance.setCellFactory(new FormattedNumberCellFactory<>(value -> recordingMode.isSpeed() ? getContext() .getFormatUtils().distanceToString(value.doubleValue() / 1000d, 3) : null)); tcCadence.setCellFactory(new FormattedNumberCellFactory<>(value -> recordingMode.isCadence() ? getContext() .getFormatUtils().cadenceToString(value.intValue()) : null)); tcTemperature.setCellFactory(new FormattedNumberCellFactory<>( value -> recordingMode.isTemperature() ? getContext().getFormatUtils().temperatureToString( value.shortValue()) : null)); // set table data tvSamples.setPlaceholder(new Label(getContext().getResources().getString("pv.info.no_data_available"))); final ExerciseSample[] samples = getDocument().getExercise().getSampleList(); tvSamples.setItems(FXCollections.observableArrayList(samples == null ? new ExerciseSample[0] : samples)); // default sort is the time column tvSamples.getSortOrder().add(tcTime); } }